import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import aima.search.framework.Successor;
import aima.search.framework.SuccessorFunction;

@SuppressWarnings("unchecked")
public class IAPrac1SuccessorFunction implements SuccessorFunction {

        public List<Successor> getSuccessors(Object aState) {
                List<Successor> successors = new ArrayList<Successor>();
                IAPrac1State estado = (IAPrac1State) aState;
                IAPrac1State nuevoEstado = null;
                
                Vector conds = estado.getConductores();
                Vector pass = estado.getPasajerosPendientes();
                int nconds = IAPrac1State.K;
                int npass = estado.npas;
                Vector cruta = null;
                Vector rec = null;
                int nruta;
                int pas;
                String S = null;
                
                for(int con = 0; con < nconds; con++) {
                        cruta = (Vector)conds.get(con);
                        if (cruta != null) {
                                nruta = cruta.size();        


                                for(int i = 0; i < nruta; i++) {
                                        pas = ((Integer)cruta.get(i)).intValue();
                                        nuevoEstado = new IAPrac1State(conds, estado.ncond, pass, estado.npas);
                                        if (nuevoEstado.switchPasajeros(con, i)) {
                                                S = IAPrac1State.INTERCAMBIAR_CONTIGUOS+"-"+con+"-"+i;
                                                successors.add(new Successor(S, nuevoEstado));
                                        }
                                }

                                for(int i = 0; i < npass; i++) {
                                        pas = ((Integer)pass.get(i)).intValue();
                                        nuevoEstado = new IAPrac1State(conds, estado.ncond, pass, estado.npas);
                                        if (pass.contains(pas) && nuevoEstado.asignarPasajero(con, pas)) {
                                                S = IAPrac1State.ASIGNAR+"-"+con+"-"+pas;
                                                successors.add(new Successor(S, nuevoEstado));
                                        }       
                                }
                                        
                                rec = new Vector<Integer>();
                                for(int i = 0; i < nruta; i++) {
                                        pas = ((Integer)cruta.get(i)).intValue();
                                        
                                        if(!rec.contains(pas)) {
                                                rec.add(pas);
                                                nuevoEstado = new IAPrac1State(conds, estado.ncond, pass, estado.npas);
                                                
                                                for(int con2 = 0; con2 < nconds; con2++) {
                                                        if(con2 != con && conds.get(con2) != null) {
                                                                nuevoEstado = new IAPrac1State(conds, estado.ncond, pass, estado.npas);
                                                                if (nuevoEstado.moverPasajero(con, pas, con2)) {
                                                                		S = IAPrac1State.MOVER+"-"+con+"-"+pas+"-"+con2;
                                                                        successors.add(new Successor(S, nuevoEstado));
                                                                }
                                                        }
                                                }
                                        }
                                }
                                
                                nuevoEstado = new IAPrac1State(conds, estado.ncond, pass, estado.npas);
                                if (nuevoEstado.eliminarConductor(con)) {
                                        S = IAPrac1State.ELIMINAR_CONDUCTOR+"-"+con; 
                                        successors.add(new Successor(S, nuevoEstado));
                                }
                        }  
                }
                
                return successors;
        }
}